<?php
/**
 * VCMINI框架
 * 
 * 采用view和controller组成的VC结构实现
 */

//设置文档头部（用于错误信息输出）
header('content-type:text/html;charset=utf-8');

//设置默认时区
date_default_timezone_set('PRC');

//开启session
session_start();

//设置项目根路径，也就是本文件index.php所在路径
define('BASEPATH', dirname(__FILE__) . '/');

//检查配置文件是否存在，不存在则输出错误信息
//配置文件位于 BASE/config.php
if(!file_exists('./config.php')) {
	echo '<h3>系统配置文件缺失</h3>';
	exit(1);
}

//引入配置文件
require('./config.php');

//如果开启了调试则开启错误提示
if($config['debug'] == true) {
	ini_set('display_errors', 'on');
}

//设置根文件夹，当项目转移到下级目录时需要在配置文件的basePath中设置
define('BASEDIR', ($config['basePath'] == '' || $config['basePath'] == '/') ? '/' : '/' . trim($config['basePath'], '/') . '/');

//项目主要工作区域路径，包括控制器和视图
define('APPSPATH', BASEPATH . 'apps/');

//控制器文件所在路径
define('CONPATH', APPSPATH . 'controllers/');

//视图文件所在路径
define('VIEWPATH', APPSPATH . 'views/');

define('MODELPATH', APPSPATH . 'models/');	

//视图模板文件所在路径
define('TEMPPATH', VIEWPATH . 'templates/');

//框架系统文件所在路径，包含类库、模块、配置等
define('SYSPATH', BASEPATH . 'sys/');

//类文件所在路径，包含各种系统类库
define('CLSPATH', SYSPATH . 'classes/');

//配置文件所在路径，一些模块的配置文件
define('CONFPATH', SYSPATH . 'configs/');

//静态文件所在路径，文件一般为图片、js、css等文件
define('PUBSPATH', BASEPATH . 'pubs/');

//获取采用的协议类型，默认HTTP/1.1
define('PROTOCOL', isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1');

//判断是否存在公共函数库文件
//公共函数库文件位于 BASE/sys/classes/Common.php
if(!file_exists(CLSPATH . 'Common.php')) {
	echo '<h3>找不到公共函数库Common</h3>';
	exit(1);
}

//引入公共函数库文件
require_once(CLSPATH . 'Common.php');

//获取用户ip地址
define('CLIP', getClientIP());

//获取是否记录访问日志，如果是则进行记录
$logVisit = getConfigItem('logVisit');
if($logVisit == true) {
	_log('访问URL为 ' . $_SERVER['REQUEST_URI']);
}

//调用软件级防火墙进行扫描
$fireWall = &loadClass('FireWall', array('ip' => CLIP));
$fireWall->banIPScan();

//初始化配置数据
getConfig($config);

//设置错误处理器函数，错误将由自定义的错误处理函数处理
set_error_handler('errorHandler');

//设置异常处理器函数，异常讲由自定义的异常处理函数处理
set_exception_handler('exceptionHandler');

//加载Controller
loadClass('Controller');

//鸡肋的添加了模型类
loadClass('Model');

//加载路由模块
$router = &loadClass('Router');

//解析URI请求，分离控制器与参数
$uri = $router->getUri($_SERVER['REQUEST_URI']);

//加载请求中分离出来的控制器
$controller = loadController($uri['controller']);

//执行控制器默认函数
$controller->index($uri['params']);